package com.cheng.example.book.advise151.chap1;


import java.util.List;

/**
 * assert默认是不启用的
 * ssert跑出的异常AssertionError是继承自Error的
 * <p>
 * （1）、assert默认是不启用的。开启断言，需要假如虚拟机参数-ea
 * （2）、assert跑出的异常AssertionError是继承自Error的
 * <p>
 * <p>
 * 下列情况不能用到断言
 * (1)、在对外的公开方法中
 * (2)、在执行逻辑代码的情况下
 * <p>
 * <p>
 * 可以使用断言的三种情况
 * 1、在私有方法中放置assert作为输入参数的校验
 * 2、流程控制中不可能到达的区域
 * 3、建立程序探针
 */
public class Client19 {
    public static void main(String[] args) {
        System.out.println(StringUtils.encode(null));
//        doSomething();
    }

    public static void doSomething() {
        int i = 7;
        while (i > 7) {
            /* 业务处理 */
        }
        assert false : "到达这里就表示错误";
    }

    /**
     * (2)、在执行逻辑代码的情况下
     * assert的支持是可选的，在开发时可以让他运行，但在生产环境中系统则不需要其运行了（以便提高性能），因此在assert的布尔表达式中不能执行逻辑代码，否则会因为环境的不同而产生不同的逻辑，例如：
     */
    public static void doSomething(List list, Object element) {
        assert list.remove(element) : "删除元素" + element + "失败";
        /*业务处理*/
    }

}

class StringUtils {
    /**
     * (1)、在对外的公开方法中
     * 但就是不能用断言做输入校验，特别是公开方法。我们开看一个例子：
     */
    public static String encode(String str) {
        assert str != null : "加密的字符串为null";
        /*加密处理*/
        return str;
    }
}